/**
 ****************************************************************************************************
 * @file        can.h
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2020-04-24
 * @brief       CAN 驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 * 修改说明
 * V1.0 20200424
 * 第一次发布
 *
 ****************************************************************************************************
 */

#ifndef __CAN_H
#define __CAN_H

#include "./SYSTEM/sys/sys.h"


/******************************************************************************************/
/* CAN 引脚 定义 */

#define CAN_RX_GPIO_PORT                GPIOA
#define CAN_RX_GPIO_PIN                 GPIO_PIN_11
#define CAN_RX_GPIO_CLK_ENABLE()        do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口时钟使能 */

#define CAN_TX_GPIO_PORT                GPIOA
#define CAN_TX_GPIO_PIN                 GPIO_PIN_12
#define CAN_TX_GPIO_CLK_ENABLE()        do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口时钟使能 */

/******************************************************************************************/

/* CAN接收RX0中断使能 */
#define CAN_RX0_INT_ENABLE      1               /* 0,不使能; 1,使能; */


/* CAN消息ID定义 */
#define CAN_MSG_ID_ACTUAL_SPEED     0x200       /* G4发送实际速度给F103 */

/* 全局变量声明 */
extern volatile int32_t g_actual_speed;         /* 实际速度值 */
extern volatile uint8_t g_speed_data_updated;   /* 速度数据更新标志 */


typedef enum {
    FORWARD_ROTATION = 0, //正转
    REVERSE_ROTATION = 1 //反转
} motor_direction_t;

/* 对外接口函数 */
uint8_t can_receive_msg(uint32_t id, uint8_t *buf);             /* CAN接收数据, 查询 */
uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len);   /* CAN发送数据 */
uint8_t can_init(void); /* CAN初始化 */
uint8_t send_target_speed_via_can(int32_t speed);
uint8_t send_can_command(uint32_t msg_id, int32_t speed);       /* 通用CAN指令发送 */
int32_t get_actual_speed(void);                                 /* 获取实际速度值 */
uint8_t is_speed_data_updated(void);                            /* 检查速度数据是否更新 */

#endif

















